/**
 * 
 */
package ar.edu.ufasta.presupuestos.logica.entidades.presupuesto;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import ar.edu.ufasta.presupuestos.logica.entidades.Cliente;
import ar.edu.ufasta.presupuestos.logica.entidades.EntidadBase;
import ar.edu.ufasta.presupuestos.logica.entidades.articulo.Articulo;
import ar.edu.ufasta.presupuestos.logica.entidades.articulo.ArticuloSimple;
import ar.edu.ufasta.presupuestos.logica.entidades.estados.Anulado;
import ar.edu.ufasta.presupuestos.logica.entidades.estados.Aprovado;
import ar.edu.ufasta.presupuestos.logica.entidades.estados.Conformado;
import ar.edu.ufasta.presupuestos.logica.entidades.estados.Desaprovado;
import ar.edu.ufasta.presupuestos.logica.entidades.estados.EnProceso;
import ar.edu.ufasta.presupuestos.logica.entidades.estados.Estado;
import ar.edu.ufasta.presupuestos.logica.entidades.estados.Terminado;
import ar.edu.ufasta.presupuestos.servicios.persistencia.ObjectID;
import ar.edu.ufasta.presupuestos.servicios.persistencia.PersistenceFacade;

/**
 * @author Carlos
 * 
 */
public class Presupuesto extends EntidadBase {

	// Atributos
	/*
	 * (non-javadoc)
	 */
	private Date fechaEmision;

	/*
	 * (non-javadoc)
	 */
	private Cliente cliente;

	/*
	 * (non-javadoc)
	 */
	private FormaPago formaPago;

	/*
	 * Cambiar atributo de String a Objecto Estado
	 */
	private Estado estado;

	/*
	 * Quitar este atributo cuando este la lista de articulos
	 */
	private Double total;

	private List<DetallePresupuesto> detallePresupuesto;
	
	public Presupuesto(){
		detallePresupuesto = new ArrayList<DetallePresupuesto>();
	}
	/**
	 * Getter of the property <tt>id</tt>
	 * 
	 * @return Returns the id.
	 * 
	 */
	public Cliente getCliente() {
		return cliente;
	}

	/**
	 * Getter of the property <tt>id</tt>
	 * 
	 * @return Returns the id.
	 * 
	 */
	public Estado getEstado() {
		return estado;
	}

	public int getEstadoCode() {
		return this.estado.getCode();
	}

	/**
	 * Getter of the property <tt>fechaEmision</tt>
	 * 
	 * @return Returns the fechaEmision.
	 * 
	 */
	public Date getFechaEmision() {
		return fechaEmision;
	}

	/**
	 * Getter of the property <tt>id</tt>
	 * 
	 * @return Returns the id.
	 * 
	 */
	public FormaPago getFormaPago() {
		return formaPago;
	}


	/**
	 * Getter of the property <tt>id</tt>
	 * 
	 * @return Returns the id.
	 * 
	 */
	public Double getTotal() {
		return total;
	}

	/**
	 * Setter of the property <tt>id</tt>
	 * 
	 * @param cliente to set.
	 * 
	 */
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	/**
	 * Setter of the property <tt>id</tt>
	 * 
	 * @param estado to set.
	 * 
	 */
	public void setEstado(Estado estado) {
		this.estado = estado;
	}

	/**
	 * Setter of the property <tt>fechaEmision</tt>
	 * 
	 * @param fechaEmision The fechaEmision to set.
	 * 
	 */
	public void setFechaEmision(Date fechaEmision) {
		this.fechaEmision = fechaEmision;
	}

	/**
	 * Setter of the property <tt>id</tt>
	 * 
	 * @param formaPago to set.
	 * 
	 */
	public void setFormaPago(FormaPago formaPago) {
		this.formaPago = formaPago;
	}



	/**
	 * Setter of the property <tt>id</tt>
	 * 
	 * @param total to set.
	 * 
	 */
	public void setTotal(Double total) {
		this.total = total;
	}

	/**
	 * @return the detallePresupuesto
	 */
	public List<DetallePresupuesto> getDetallePresupuesto() {
		return detallePresupuesto;
	}

	/**
	 * @param detallePresupuesto the detallePresupuesto to set
	 */
	public void setDetallePresupuesto(List<DetallePresupuesto> detallePresupuesto) {
		this.detallePresupuesto = detallePresupuesto;
	}
	
	public Integer agregarNuevoDetalle(Integer ID,Integer cantidad, Integer IDDetalle){
		try {
			DetallePresupuesto renglon = new DetallePresupuesto();
			renglon.setCantidad(cantidad);
			ArticuloSimple art = new ArticuloSimple();
			art.setOid(new ObjectID(ID));
			renglon.setArticulo(art);
			renglon.setPresupuesto(this);
			if (IDDetalle != -1)
				renglon.setOid(new ObjectID(IDDetalle));
				//renglon.setIDDetalle(IDDetalle);
			renglon.setFlags(0);
			detallePresupuesto.add(renglon);
		} catch (Exception e) {
			return -1;
		}
		return 0;
	}
	
	public int resolver(){
		int resul;
		resul = this.estado.resolver(this);
		return resul;
	}
	
	public void setEstadoInstance(Integer codeEstado) {
		// Creo la instancia correcta del presupuesto
		switch (codeEstado) {
		case 1:
			this.estado = new Conformado();
			break;
		case 2:
			this.estado = new Aprovado();
			break;
		case 3:
			this.estado = new Desaprovado();
			break;
		case 4:
			this.estado = new Terminado();
			break;
		case 5:
			this.estado = new Anulado();
			break;
		case 6:
			this.estado = new EnProceso();
			break;
		default:
			this.estado = new Conformado();
			break;
		}
		
	}

	public Boolean estanDetallesTerminados(){
		Boolean terminados =  Boolean.TRUE;
		List<DetallePresupuesto> detalles = this.detallePresupuesto;
		for (DetallePresupuesto detalle : detalles) {
			if(detalle.estaPendiente()){
				terminados = Boolean.FALSE;
			}
		}		
		return terminados;
	}
	
	
	public void completarDetallePendiente(Articulo articulo, Integer cantidad){
		List<DetallePresupuesto> listadoDetalle = this.detallePresupuesto;
		for (DetallePresupuesto item: listadoDetalle) {
			if(item.estaPendiente() && item.getArticulo().equals(articulo)){
				item.establecerComoTerminado();
				PersistenceFacade.getInstance().put(this);
				break;
			}
		}
		if(this.estanDetallesTerminados()){
			this.setEstado(new Terminado());
			PersistenceFacade.getInstance().put(this);
		}
	} 
	
	
}
